From e9a56d968905941c99aa901fc20b7a7ef213d7fd Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 7 Aug 2020 11:21:28 +0200 Subject: [PATCH] Add patch for endianness issues --- debian/patches/618.patch | 141 +++++++++++++++++++++++++++++++++++++++ debian/patches/series | 1 + debian/rules | 2 +- 3 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 debian/patches/618.patch diff --git a/debian/patches/618.patch b/debian/patches/618.patch new file mode 100644 index 000000000..c90400b9a --- /dev/null +++ b/debian/patches/618.patch @@ -0,0 +1,141 @@ +From ba6a359d7be51ee1d0a553cc584103395675ea8e Mon Sep 17 00:00:00 2001 +From: tsteven4 <13596209+tsteven4@users.noreply.github.com> +Date: Thu, 6 Aug 2020 08:23:11 -0600 +Subject: [PATCH] fix endianness/packing issues with energympro, + globalsat_sport. + +this was motivated by test failures seen at +https://buildd.debian.org/status/fetch.php?pkg=gpsbabel&arch=s390x&ver=1.7.0%2Bds-3&stamp=1594393020&raw=0 +--- + energympro.cc | 58 ++++++++++++++++++++++++++++++++++++++++------ + energympro.h | 2 +- + globalsat_sport.cc | 6 ++--- + 3 files changed, 55 insertions(+), 11 deletions(-) + +diff --git a/energympro.cc b/energympro.cc +index 2695a8f52..978052a18 100644 +--- a/energympro.cc ++++ b/energympro.cc +@@ -33,7 +33,7 @@ + + #include "defs.h" + #include "energympro.h" +-#include "gbfile.h" // for gbfgetc, gbfseek, gbfclose, gbfopen, gbfread, gbfgetuint32, gbfcopyfrom, gbfgetuint16, gbfile, gbsize_t ++#include "gbfile.h" // for gbfgetc, gbfgetuint16, gbfgetuint32, gbfseek, gbfgetint16, gbfclose, gbfopen, gbfcopyfrom, gbfile, gbsize_t + #include "src/core/datetime.h" // for DateTime + + +@@ -46,22 +46,48 @@ void + EnergymproFormat::read_point(route_head* gpsbabel_route, gpsbabel::DateTime& gpsDateTime) const + { + tw_point point{}; +- gbfread(&point, sizeof(tw_point), 1, file_in); ++ point.Latitude = gbfgetuint32(file_in); ++ point.Longitude = gbfgetuint32(file_in); ++ point.Altitude = gbfgetint16(file_in); ++ point.reserved1 = gbfgetuint16(file_in); ++ point.Speed = gbfgetuint32(file_in); ++ point.IntervalDist = gbfgetuint16(file_in); ++ point.reserved2 = gbfgetuint16(file_in); ++ point.IntervalTime = gbfgetuint32(file_in); ++ point.Status = gbfgetc(file_in); ++ point.HR_Heartrate = gbfgetc(file_in); ++ point.HR_Status = gbfgetc(file_in); ++ point.reserved3 = gbfgetc(file_in); ++ point.Speed_Speed = gbfgetuint32(file_in); ++ point.Speed_Status = gbfgetc(file_in); ++ point.reserved4 = gbfgetc(file_in); ++ point.reserved5 = gbfgetc(file_in); ++ point.reserved6 = gbfgetc(file_in); ++ point.Cadence_Cadence = gbfgetc(file_in); ++ point.Cadence_Status = gbfgetc(file_in); ++ point.Power_Cadence = gbfgetuint16(file_in); ++ point.Power_Power = gbfgetuint16(file_in); ++ point.Power_Status = gbfgetc(file_in); ++ point.reserved7 = gbfgetc(file_in); ++ point.Temp = gbfgetc(file_in); ++ point.reserved8 = gbfgetc(file_in); ++ point.reserved9 = gbfgetc(file_in); ++ point.reserved10 = gbfgetc(file_in); + if (global_opts.debug_level > 1) { + printf("Point: lat:%8u long:%8u alt:%8d ", point.Latitude, point.Longitude, point.Altitude); +- printf("speed:%6u dist:%5u time:%5u Status:%1u", point.Speed, point.IntervalDist, point.lntervalTime, point.Status); ++ printf("speed:%6u dist:%5u time:%5u Status:%1u", point.Speed, point.IntervalDist, point.IntervalTime, point.Status); + printf("HR:(%3d,%1d)", point.HR_Heartrate, point.HR_Status); + printf("Speed:(%8u,%1d)", point.Speed_Speed, point.Speed_Status); + printf("Cad:(%3d,%1d)", point.Cadence_Cadence, point.Cadence_Status); + printf("Power (Cad:%6d Pow:%6d,%2d)Temp:%3d\n", point.Power_Cadence, point.Power_Power, point.Power_Status, point.Temp); + + qDebug() << "DateTime1:" << gpsDateTime.toString(); +- qDebug() << "point.lntervalTime:" << point.lntervalTime; ++ qDebug() << "point.IntervalTime:" << point.IntervalTime; + } + +- //Time from last point in sec's * 10 (e.g. point.lntervalTime is sec multiplied with 10) ++ //Time from last point in sec's * 10 (e.g. point.IntervalTime is sec multiplied with 10) + // convert to millisecs +- gpsDateTime = gpsDateTime.addMSecs(point.lntervalTime*100); ++ gpsDateTime = gpsDateTime.addMSecs(point.IntervalTime*100); + + auto waypt = new Waypoint; + waypt->latitude = (point.Latitude / 1000000.0); +@@ -95,7 +121,25 @@ void + EnergymproFormat::read_lap() const + { + tw_lap lap{}; +- gbfread(&lap, sizeof(tw_lap), 1, file_in); ++ lap.splitTime = gbfgetuint32(file_in); ++ lap.TotalTime = gbfgetuint32(file_in); ++ lap.Number = gbfgetuint16(file_in); ++ lap.reserved1 = gbfgetuint16(file_in); ++ lap.lDistance = gbfgetuint32(file_in); ++ lap.Calorie = gbfgetuint16(file_in); ++ lap.reserved2 = gbfgetuint16(file_in); ++ lap.MaxSpeed = gbfgetuint32(file_in); ++ lap.AvgSpeed = gbfgetuint32(file_in); ++ lap.MaxHeartrate = gbfgetc(file_in); ++ lap.AvgHeartrate = gbfgetc(file_in); ++ lap.MinAlti = gbfgetint16(file_in); ++ lap.MaxAlti = gbfgetint16(file_in); ++ lap.AvgCad = gbfgetc(file_in); ++ lap.MaxCad = gbfgetc(file_in); ++ lap.AvgPower = gbfgetuint16(file_in); ++ lap.MaxPower = gbfgetuint16(file_in); ++ lap.StartRecPt = gbfgetuint16(file_in); ++ lap.FinishRecPt = gbfgetuint16(file_in); + if (global_opts.debug_level > 1) { + printf("LAP: splitTime:%6us TotalTime:%6us LapNumber:%5d ", lap.splitTime/10, lap.TotalTime/10, lap.Number); + printf("dist:%08um Cal:%5u Speed:(%6u,%6u) ", lap.lDistance, lap.Calorie, lap.MaxSpeed, lap.AvgSpeed); +diff --git a/energympro.h b/energympro.h +index 18403fb1d..d5e9a5996 100644 +--- a/energympro.h ++++ b/energympro.h +@@ -119,7 +119,7 @@ class EnergymproFormat : public Format + uint32_t Speed; + uint16_t IntervalDist; // Interval Distance + uint16_t reserved2; +- uint32_t lntervalTime; // Interval time ++ uint32_t IntervalTime; // Interval time + uint8_t Status; //Status (0 = ok, 1 = miss, 2 = no good, 3 = bad) + uint8_t HR_Heartrate; + uint8_t HR_Status; +diff --git a/globalsat_sport.cc b/globalsat_sport.cc +index 269c55e27..af755f97b 100644 +--- a/globalsat_sport.cc ++++ b/globalsat_sport.cc +@@ -120,12 +120,12 @@ GlobalsatSportFormat::recv_byte() + if (!opt_input_dump_file) { + result=serial_recv_byte(); + } else { +- int bytes = gbfread(&result, 1, 1, in_file); +- is_fatal((bytes != 1), MYNAME ": read error"); ++ result = gbfgetc(in_file); ++ is_fatal((result < 0), MYNAME ": read error"); + } + // Check if byte should be dumped also into a file + if (dumpfile) { +- gbfwrite(&result, 1, 1, dumpfile); ++ gbfputc(result, dumpfile); + } + return result; + } diff --git a/debian/patches/series b/debian/patches/series index 9eeb150ed..3457dce87 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -7,3 +7,4 @@ htmldoc-location cross.patch gmapbase.html-location 0009-Drop-mac-libusb-libusb.h-dependency.patch +618.patch diff --git a/debian/rules b/debian/rules index 056b7a235..64a8c87cb 100755 --- a/debian/rules +++ b/debian/rules @@ -31,7 +31,7 @@ override_dh_auto_build-indep: # Ignore broken unit tests on some architectures override_dh_auto_test: -ifneq (,$(filter $(DEB_BUILD_ARCH),i386 s390x sparc64)) +ifneq (,$(filter $(DEB_BUILD_ARCH),i386)) dh_auto_test || true else dh_auto_test -- 2.30.2